/**
 * jQuery placeholder plugin v1.0.0
 * Copyright (c) 2012, Cqc1008
 * Licensed under the MIT license
 * http://www.opensource.org/licenses/mit-license.php
 */
(function ($) {
    var TO_PREVENT_REPETITION = 'PlaceholderInitialized';    // 防止重复初始化的标记。
    var STATUS_FLAG = 'PlaceholderInitialStatus';    // 用于标记当前处于何种状态。
    var PASSWORD_FLAG = 'PlaceholderPassword';    // 用于标记是否是密码类型的表单元素。
    var OPTIONS_KEY = 'jec_placeholder_options';    // 保存在每个元素上的配置数据的 KEY 值。
    var NATIVE_SUPPORT = ('placeholder' in document.createElement('input'));    // 判断浏览器是否支持 placeholder 属性。

    function _init(elm) {
        $(elm).addClass(TO_PREVENT_REPETITION);
        var val = $(elm).val();
        if ('' == val) {
            _toInitial(elm);
        } else {
            _toNormal(elm, val);
        }
    }

    /**
     * 转换到初始状态
     */
    function _toInitial(elm) {
        var options = $(elm).data(OPTIONS_KEY);
        // 判断是否是密码类型表单元素
        if ($(elm).is('[type="password"]')) {
            elm.type = 'text';
            $(elm).addClass(PASSWORD_FLAG);
        }
        $(elm).val(options.tip);
        $(elm).addClass(STATUS_FLAG);
        if (options.initialColor) {
            $(elm).css('color', options.initialColor);
        }
        if (options.initialClass) {
            $(elm).addClass(options.initialClass);
        }
        if (options.normalClass) {
            $(elm).removeClass(options.normalClass);
        }
    }

    /**
     * 转换到正常状态
     */
    function _toNormal(elm, value) {
        var options = $(elm).data(OPTIONS_KEY);
        // 判断是否是密码类型表单元素
        if ($(elm).hasClass(PASSWORD_FLAG)) {
            elm.type = 'password';
            $(elm).removeClass(PASSWORD_FLAG);
        }
        $(elm).val(value ? value : '');
        $(elm).removeClass(STATUS_FLAG);
        if (options.normalColor) {
            $(elm).css('color', options.normalColor);
        }
        if (options.initialClass) {
            $(elm).removeClass(options.initialClass);
        }
        if (options.normalClass) {
            $(elm).addClass(option.normalClass);
        }
    }

    /**
     * 构造方法
     */
    $.fn.placeholder = function (options) {
        opts = $.extend({}, $.fn.placeholder.defaults, options);
        $(this).data(OPTIONS_KEY, opts);    // 将配置信息保存到每个元素上。

        return this.each(function (i, n) {
            // 该功能不支持除input和textarea以外的元素。
            if (!$(n).is('input, textarea')) {
                return $(n);
            }

            // 判断是否使用浏览器原生的placeholder属性。
            if (opts.useInherentFunction && NATIVE_SUPPORT) {
                // 如果浏览器支持placeholder属性，则使用该属性
                $(n).attr('placeholder', opts.tip);
                return $(n);
            }

            // 防止重复绑定
            if ($(n).hasClass(TO_PREVENT_REPETITION)) {
                return $(n);
            }

            _init(n);

            // 绑定事件
            $(n).focus(function (ev) {
                if ($(ev.target).hasClass(STATUS_FLAG)) {
                    _toNormal(ev.target);
                }
            }).blur(function (ev) {
                if ('' == $(ev.target).val()) {
                    _toInitial(ev.target);
                }
            });
            // 父Form提交时将提示信息清空
            $(n).parents('form').submit(function (ev) {
                if ($(n).hasClass(STATUS_FLAG)) {
                    $(n).val('');
                }
            });

            return $(n);
        });
    }

    $.fn.placeholder.defaults = {
        tip: 'Enter Text',
        initialColor: '#ccc',
        normalColor: '#000',
        initialClass: '',
        normalClass: '',
        useInherentFunction: true,
        autoLoad: true
    };
})(jQuery);

// 实现自动装载
$(function () {
    if ($.fn.placeholder.defaults.autoLoad) {
        $('[placeholder]').each(function (i, n) {
            var tip = $(n).attr('placeholder');
            if (tip) {
                $(n).placeholder({tip: tip});
            }
        });
    }
});
